package main

import (
	"fmt"
	"math"
)

func main() {
	//  var 关键字:声明变量
	var name string = "张三"
	fmt.Println("name is " + name)
	var (
		aa string
		bb int
	)
	fmt.Println(aa, bb)

	// 推断类型
	// 简短的变量定义和初始化语法有以下限制：
	// 定义变量，同时显式初始化。
	// 不能提供数据类型。
	// 只能用在函数内部。
	age := 18 // var age int
	fmt.Println("age is ", age)

	//  const —— 编译期常量，永不改变： 只能是 基本类型（bool、数值、string）
	const pi = 3.1415       // 无类型常量，可赋值给任何浮点
	const e float64 = 2.718 // 显式指定类型
	// 常量的值必须是能够在编译时就能够确定的，不能使用函数调用或运行时计算的值来初始化常量。
	const two = 200 / 100

	// iota 常量生成器
	// 在一个 const 声明语句中，在第一个声明的常量所在的行，iota 将会被置为 0，然后在每一个有常量声明的行加一。
	type Weekday int
	const (
		Sunday Weekday = iota
		Monday
		Tuesday
		Wednesday
		Thursday
		Friday
		Saturday
	)
	// 无类型常量
	// 虽然一个常量可以有任意一个确定的基础类型，例如 int 或 float64，或者是类似 time.Duration 这样的基础类型，
	// 但是许多常量并没有一个明确的基础类型
	// math.Pi 无类型的浮点数常量，可以直接用于任意需要浮点数或复数的地方
	var x float32 = math.Pi
	var y float64 = math.Pi
	var z complex128 = math.Pi
	fmt.Println(x, y, z)
}
